package com.hch.datastructure.recursive;

import java.util.concurrent.CountDownLatch;

public class QueueEight {
    //下表(n+1)表示行，array的值(val+1)代表列
    int[] array = new int[8];
    static int count;

    public static void main(String[] args) {
        new QueueEight().place(0);
        System.out.println(count);
    }

    public void place(int n) {
        if (n == array.length) {
            print();
            return;
        }
//依次放入皇后
        for (int i = 0; i < array.length; i++) {
//            把当前的皇后n放到 第i+1列
            array[n] = i;
//
            if (check(n)) {
                place(n + 1);
            }
        }


    }

    //对当前数组排列是否符合规则进行判断
    private boolean check(int n) {

        //1. array[i] == array[n]  表示判断 第n个皇后是否和前面的n-1个皇后在同一列
        for (int li = 0; li < n; li++) {
//            两行n-li的绝对值 两列array[n] - array[li]的绝对值相等代表在同一斜线上
            if (array[li] == array[n] || Math.abs(n - li) == Math.abs(array[n] - array[li])) {
                return false;
            }
        }

        return true;
    }

    //写一个方法，可以将皇后摆放的位置输出
    private void print() {
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}
